/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.opt.recherchemulticriteres.services.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.opt.recherchemulticriteres.builder.DTOCampagneRechMultiCriteresBuilder;
import fr.generali.accueilclient.opt.recherchemulticriteres.builder.DTOClientRechMultiCriteresBuilder;
import fr.generali.accueilclient.opt.recherchemulticriteres.builder.DTODossierRechMultiCriteresBuilder;
import fr.generali.accueilclient.opt.recherchemulticriteres.builder.DTOMotifsRechMultiCriteresBuilder;
import fr.generali.accueilclient.opt.recherchemulticriteres.om.ICampagneRechMultiCriteres;
import fr.generali.accueilclient.opt.recherchemulticriteres.om.IClientRechMultiCriteres;
import fr.generali.accueilclient.opt.recherchemulticriteres.om.ICriteresCampagneRechMultiCriteres;
import fr.generali.accueilclient.opt.recherchemulticriteres.om.ICriteresClientListeRechMultiCriteres;
import fr.generali.accueilclient.opt.recherchemulticriteres.om.ICriteresClientRechMultiCriteres;
import fr.generali.accueilclient.opt.recherchemulticriteres.om.ICriteresCodeCampagneRechMultiCriteres;
import fr.generali.accueilclient.opt.recherchemulticriteres.om.ICriteresIssueRechMultiCriteres;
import fr.generali.accueilclient.opt.recherchemulticriteres.om.ICriteresResponsableRechMultiCriteres;
import fr.generali.accueilclient.opt.recherchemulticriteres.om.ICriteresStatutRechMultiCriteres;
import fr.generali.accueilclient.opt.recherchemulticriteres.om.IDossierRechMultiCriteres;
import fr.generali.accueilclient.opt.recherchemulticriteres.om.IMotifsRechMultiCriteres;
import fr.generali.relationclient.marketing.opt.recherchemulticriteres.DtoCriteresCampagne;
import fr.generali.relationclient.marketing.opt.recherchemulticriteres.DtoCriteresClient;
import fr.generali.relationclient.marketing.opt.recherchemulticriteres.DtoCriteresClientId;
import fr.generali.relationclient.marketing.opt.recherchemulticriteres.DtoCriteresCodeCampagne;
import fr.generali.relationclient.marketing.opt.recherchemulticriteres.DtoCriteresIssue;
import fr.generali.relationclient.marketing.opt.recherchemulticriteres.DtoCriteresResponsable;
import fr.generali.relationclient.marketing.opt.recherchemulticriteres.DtoCriteresStatut;
import fr.generali.relationclient.marketing.opt.recherchemulticriteres.DtoDossier;
import fr.generali.relationclient.marketing.opt.recherchemulticriteres.DtoMotifs;
import fr.generali.relationclient.marketing.opt.recherchemulticriteres.builder.DtoCriteresCampagneBuilder;
import fr.generali.relationclient.marketing.opt.recherchemulticriteres.builder.DtoCriteresClientBuilder;
import fr.generali.relationclient.marketing.opt.recherchemulticriteres.builder.DtoCriteresClientIdBuilder;
import fr.generali.relationclient.marketing.opt.recherchemulticriteres.builder.DtoCriteresCodeCampagneBuilder;
import fr.generali.relationclient.marketing.opt.recherchemulticriteres.builder.DtoCriteresIssueBuilder;
import fr.generali.relationclient.marketing.opt.recherchemulticriteres.builder.DtoCriteresResponsableBuilder;
import fr.generali.relationclient.marketing.opt.recherchemulticriteres.builder.DtoCriteresStatutBuilder;

/**
 * @author Holmes Kelly
 */

@Component("rechercheListeDossiersMultiCriteresMapper")
public class RechercheListeDossiersMultiCriteresMapper {

    /**
     * @param criteresCampagne criteres campagne en entree
     * @return DtoCriteresCampagne
     */
    public DtoCriteresCampagne mapperCriteresCampagne2DtoCriteresCampagne(
                    ICriteresCampagneRechMultiCriteres criteresCampagne) {

        DtoCriteresCampagne dtoCriteresCampagne = null;

        if (criteresCampagne != null) {

            List<DtoCriteresCodeCampagne> listeCriteresCodeCampagne =
                            mapperCriteresCodeCampagne2DtoCriteresCodeCampagne(criteresCampagne.getListeCodeCampagne());
            List<DtoCriteresIssue> listeCriteresIssue =
                            mapperCriteresIssue2DtoCriteresIssue(criteresCampagne.getListeIssue());
            List<DtoCriteresResponsable> listeCriteresNomActeurResponsable =
                            mapperCriteresNomActeurResponsable2DtoCriteresNomActeurResponsable(criteresCampagne
                                            .getListeNomActeurResponsable());
            List<DtoCriteresStatut> listeCriteresStatut =
                            mapperCriteresStatut2DtoCriteresStatut(criteresCampagne.getListeStatut());

            dtoCriteresCampagne =
                            DtoCriteresCampagneBuilder.dtoCriteresCampagne()
                                            .buildIdIntermediaire(criteresCampagne.getIdIntermediaire())
                                            .buildDateEcheanceMax(criteresCampagne.getDateEcheanceMax())
                                            .buildDateEcheanceMin(criteresCampagne.getDateEcheanceMin())
                                            .buildAddedListeCodeCampagne(listeCriteresCodeCampagne)
                                            .buildAddedListeIssue(listeCriteresIssue)
                                            .buildAddedListeNomActeurResponsable(listeCriteresNomActeurResponsable)
                                            .buildAddedListeStatut(listeCriteresStatut).build();
        }

        return dtoCriteresCampagne;
    }

    /**
     * @param criteresClient criteres client en entree
     * @return DtoCriteresClient
     */
    public DtoCriteresClient mapperCriteresClient2DtoCriteresClient(ICriteresClientRechMultiCriteres criteresClient) {

        DtoCriteresClient dtoCriteresClient = null;

        if (criteresClient != null) {

            dtoCriteresClient =
                            DtoCriteresClientBuilder.dtoCriteresClient()
                                            .buildIdIntermediaire(criteresClient.getIdIntermediaire())
                                            .buildNom(criteresClient.getNom()).buildPrenom(criteresClient.getPrenom())
                                            .build();

        }
        return dtoCriteresClient;
    }

    /**
     * @param criteresClientListe criteres client (numero client en entree)
     * @return DtoCriteresClientId
     */
    public DtoCriteresClientId mapperCriteresClientId2DtoCriteresClientId(
                    ICriteresClientListeRechMultiCriteres criteresClientListe) {

        DtoCriteresClientId dtoCriteresClientListe = null;

        if (criteresClientListe != null) {

            dtoCriteresClientListe =
                            DtoCriteresClientIdBuilder.dtoCriteresClientId()
                                            .buildIdClientRce(criteresClientListe.getIdClientRce())
                                            .buildIdClient(criteresClientListe.getIdClient())
                                            .buildIdIntermediaire(criteresClientListe.getIdIntermediaire()).build();

        }

        return dtoCriteresClientListe;
    }

    /**
     * @param listDtoDossier reponse
     * @return liste DTODossier
     */
    public List<IDossierRechMultiCriteres> mapperDtoDossier2DossierRechMultiCriteres(List<DtoDossier> listDtoDossier) {

        List<IDossierRechMultiCriteres> listeDossierRechMultiCriteres = new ArrayList<IDossierRechMultiCriteres>();

        CollectionUtils.collect(listDtoDossier, getTransformerDtoDossier2DossierRechMultiCriteres(),
                        listeDossierRechMultiCriteres);

        return listeDossierRechMultiCriteres;
    }

    /**
     * @param listCriteresResponsable liste criteres responsable en entree
     * @return list DtoCriteresResponsable
     */
    private List<DtoCriteresResponsable> mapperCriteresNomActeurResponsable2DtoCriteresNomActeurResponsable(
                    List<ICriteresResponsableRechMultiCriteres> listCriteresResponsable) {

        List<DtoCriteresResponsable> listeDtoCriteresResponsable = new ArrayList<DtoCriteresResponsable>();

        CollectionUtils.collect(listCriteresResponsable, getTransformerCriteresResponsable2DtoCriteresResponsable(),
                        listeDtoCriteresResponsable);

        return listeDtoCriteresResponsable;
    }

    /**
     * @param listCriteresCodeCampagne liste criteres code campagne en entree
     * @return listeDtoCriteresCodeCampagnes la liste des critères de code
     *         campagne
     */
    private List<DtoCriteresCodeCampagne> mapperCriteresCodeCampagne2DtoCriteresCodeCampagne(
                    List<ICriteresCodeCampagneRechMultiCriteres> listCriteresCodeCampagne) {

        List<DtoCriteresCodeCampagne> listeDtoCriteresCodeCampagnes = new ArrayList<DtoCriteresCodeCampagne>();

        CollectionUtils.collect(listCriteresCodeCampagne, getTransformerCriteresCodeCampagne2DtoCriteresCodeCampagne(),
                        listeDtoCriteresCodeCampagnes);

        return listeDtoCriteresCodeCampagnes;
    }

    /**
     * @param listCriteresIssues list criteres issue en entree
     * @return list DtoCriteresIssue
     */
    private List<DtoCriteresIssue> mapperCriteresIssue2DtoCriteresIssue(
                    List<ICriteresIssueRechMultiCriteres> listCriteresIssues) {

        List<DtoCriteresIssue> listeDtoCriteresIssues = new ArrayList<DtoCriteresIssue>();

        CollectionUtils.collect(listCriteresIssues, getTransformerCriteresIssue2DtoCriteresIssue(),
                        listeDtoCriteresIssues);

        return listeDtoCriteresIssues;
    }

    /**
     * @param listCriteresStatut list criteres statut en entree
     * @return list DtoCriteresStatut
     */
    private List<DtoCriteresStatut> mapperCriteresStatut2DtoCriteresStatut(
                    List<ICriteresStatutRechMultiCriteres> listCriteresStatut) {

        List<DtoCriteresStatut> listeDtoCriteresStatut = new ArrayList<DtoCriteresStatut>();

        CollectionUtils.collect(listCriteresStatut, getTransformerCriteresStatut2DtoCriteresStatut(),
                        listeDtoCriteresStatut);

        return listeDtoCriteresStatut;
    }

    /**
     * @return transformer criteres issue -> dossier campagne
     */
    private Transformer getTransformerCriteresIssue2DtoCriteresIssue() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                ICriteresIssueRechMultiCriteres criteresIssueRechMultiCriteres =
                                ICriteresIssueRechMultiCriteres.class.cast(input);

                DtoCriteresIssue dtoCriteresIssue =
                                DtoCriteresIssueBuilder
                                                .dtoCriteresIssue()
                                                .buildIssueOpportunite(
                                                                criteresIssueRechMultiCriteres.getIssueOpportunite())
                                                .build();

                return dtoCriteresIssue;
            }
        };

        return transformer;
    }

    /**
     * @return transformer criteres responsable -> dossier campagne
     */
    private Transformer getTransformerCriteresResponsable2DtoCriteresResponsable() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                ICriteresResponsableRechMultiCriteres criteresResponsableRechMultiCriteres =
                                ICriteresResponsableRechMultiCriteres.class.cast(input);

                String nomActeurResponsable = criteresResponsableRechMultiCriteres.getNomActeurResponsable();
                DtoCriteresResponsable dtoCriteresResponsable =
                                DtoCriteresResponsableBuilder.dtoCriteresResponsable()
                                                .buildNomActeurResponsable(nomActeurResponsable).build();

                return dtoCriteresResponsable;
            }
        };

        return transformer;
    }

    /**
     * @return transformer criteres code campagne -> dossier campagne
     */
    private Transformer getTransformerCriteresCodeCampagne2DtoCriteresCodeCampagne() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                ICriteresCodeCampagneRechMultiCriteres criteresCodeCampagneRechMultiCriteres =
                                ICriteresCodeCampagneRechMultiCriteres.class.cast(input);

                String codeCampagne = criteresCodeCampagneRechMultiCriteres.getCodeCampagne();
                DtoCriteresCodeCampagne dtoCriteresCodeCampagne =
                                DtoCriteresCodeCampagneBuilder.dtoCriteresCodeCampagne()
                                                .buildCodeCampagne(codeCampagne).build();

                return dtoCriteresCodeCampagne;
            }
        };

        return transformer;
    }

    /**
     * @return transformer criteres statut -> dossier campagne
     */
    private Transformer getTransformerCriteresStatut2DtoCriteresStatut() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                ICriteresStatutRechMultiCriteres criteresStatutRechMultiCriteres =
                                ICriteresStatutRechMultiCriteres.class.cast(input);

                DtoCriteresStatut dtoCriteresStatut =
                                DtoCriteresStatutBuilder
                                                .dtoCriteresStatut()
                                                .buildStatutOpportunite(
                                                                criteresStatutRechMultiCriteres.getStatutOpportunite())
                                                .build();

                return dtoCriteresStatut;
            }
        };

        return transformer;
    }

    /**
     * @return transformer dtoDossier -> dossier recherche multi criteres
     */
    private Transformer getTransformerDtoDossier2DossierRechMultiCriteres() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                DtoDossier dtoDossier = DtoDossier.class.cast(input);

                ICampagneRechMultiCriteres builderCampagneRechMultiCriteres =
                                DTOCampagneRechMultiCriteresBuilder.dTOCampagneRechMultiCriteres()
                                                .buildNom(dtoDossier.getCampagne().getNom())
                                                .buildEndDate(dtoDossier.getCampagne().getEndDate()).build();

                IClientRechMultiCriteres builderClientRechMultiCriteres =
                                DTOClientRechMultiCriteresBuilder
                                                .dTOClientRechMultiCriteres()
                                                .buildNom(dtoDossier.getClient().getNom())
                                                .buildPrenom(dtoDossier.getClient().getPrenom())
                                                .buildIdentifiantRCE(dtoDossier.getClient().getIdentifiantRCE())
                                                .buildLibelleCivilite(dtoDossier.getClient().getLibelleCivilite())
                                                .buildTelephonePrincipal(dtoDossier.getClient().getTelephonePrincipal())
                                                .build();

                List<IMotifsRechMultiCriteres> listeBuilderMotifsRechMultiCriteres =
                                new ArrayList<IMotifsRechMultiCriteres>();
                CollectionUtils.collect(dtoDossier.getMotifs(), getTransformerDtoMotifs2MotifsRechMultiCriteres(),
                                listeBuilderMotifsRechMultiCriteres);

                IDossierRechMultiCriteres dossierRechMultiCriteres =
                                DTODossierRechMultiCriteresBuilder
                                                .dTODossierRechMultiCriteres()
                                                .buildCampagne(builderCampagneRechMultiCriteres)
                                                .buildClient(builderClientRechMultiCriteres)
                                                .buildCodeIssue(dtoDossier.getCodeIssue())
                                                .buildCodeOrigine(dtoDossier.getCodeOrigine())
                                                .buildCodeStatut(dtoDossier.getCodeStatut())
                                                .buildCreationDate(dtoDossier.getCreationDate())
                                                .buildClotureDate(dtoDossier.getClotureDate())
                                                .buildIdentifiantIntermediaire(dtoDossier.getIdentifiantIntermediaire())
                                                .buildIdentifiantResponsable(dtoDossier.getIdentifiantResponsable())
                                                .buildNomActeurResponsable(dtoDossier.getNomActeurResponsable())
                                                .buildNumeroReference(dtoDossier.getNumeroReference())
                                                .buildSousType(dtoDossier.getSousType())
                                                .buildVisibilite(dtoDossier.getVisibilite())
                                                .buildMotifs(listeBuilderMotifsRechMultiCriteres).build();

                return dossierRechMultiCriteres;
            }
        };

        return transformer;
    }

    /**
     * @return transformer dtoMotifs -> motifs multi criteres
     */
    private Transformer getTransformerDtoMotifs2MotifsRechMultiCriteres() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                DtoMotifs dtoMotifs = DtoMotifs.class.cast(input);

                IMotifsRechMultiCriteres motifsRechMultiCriteres =
                                DTOMotifsRechMultiCriteresBuilder.dTOMotifsRechMultiCriteres()
                                                .buildIdentifiantDossier(dtoMotifs.getIdentifiantDossier())
                                                .buildIdentifiantMotif(dtoMotifs.getIdentifiantMotif())
                                                .buildNom(dtoMotifs.getNom()).build();

                return motifsRechMultiCriteres;
            }
        };

        return transformer;
    }

}
